use once_cell::sync::Lazy;
use std::sync::Arc;
use tauri::async_runtime;
use tokio::sync::RwLock;
use crate::commands::vx::is_vx_running::is_running;

/// 微信运行状态结构体
///
/// 用于记录当前微信是否处于运行状态。
#[derive(Default)]
pub struct IsVx {
    /// 微信是否正在运行
    pub running: bool,
}

/// 全局静态变量，存储微信运行状态。
///
/// - 使用 `once_cell::sync::Lazy` 实现延迟初始化，确保线程安全且只初始化一次。
/// - 使用 `Arc<RwLock<IsVx>>` 允许在多线程环境下共享与异步可变访问。
pub static IS_VX: Lazy<Arc<RwLock<IsVx>>> =
    Lazy::new(|| Arc::new(RwLock::new(IsVx::default())));

/// 初始化微信运行状态检查
///
/// 此函数在程序启动时执行一次，用于异步检查微信是否正在运行，
/// 并将结果写入全局的 [`IS_VX`] 状态中。
///
/// ### 执行逻辑
/// 1. 克隆全局状态引用，避免直接捕获静态变量所有权。
/// 2. 启动异步任务，通过 [`is_running`] 函数检测微信运行状态。
/// 3. 使用写锁 (`write().await`) 更新 `IS_VX` 中的 `running` 字段。
/// 4. 打印初始化结果日志。
///
/// ### 注意事项
/// - 本函数为异步执行，通过 `tauri::async_runtime::spawn` 启动，
///   不会阻塞主线程。
/// - 若需要在其他地方读取运行状态，可通过：
///   ```rust
///   let state = IS_VX.read().await;
///   println!("当前微信运行状态: {}", state.running);
///   ```
///
/// ### 示例
/// ```rust
/// // 在程序初始化阶段调用
/// init_wechat_check();
/// ```
pub fn init_wechat_check() {
    // 克隆全局运行状态引用，供异步任务使用
    let is_vx_clone = Arc::clone(&IS_VX);

    // 启动异步任务进行微信运行状态检测
    async_runtime::spawn(async move {
        // 调用异步函数检测微信是否运行
        let running = is_running().await;

        // 获取写锁以更新全局状态
        let mut is_vx = is_vx_clone.write().await;
        is_vx.running = running;

        // 输出调试日志
        println!("微信运行状态初始化完成: {}", running);
    });
}
